package com.qf.commons.core.utils;

import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;

import java.lang.reflect.Method;

/**
 * Spel表达式解析工具类
 * author Ken
 * create_time 2022/11/15
 */
public class SpelUtils {

    //创建一个Spel表达式的解析器
    private static ExpressionParser expression = new SpelExpressionParser();

    //Spel表达式的数据容器
    private static EvaluationContext evaluationContext = new StandardEvaluationContext();

    private static LocalVariableTableParameterNameDiscoverer localVariableTableParameterNameDiscoverer = new LocalVariableTableParameterNameDiscoverer();

    /**
     * 解析Spel表达式
     * @return
     */
    public static String spelParse(String spel, Method method, Object[] vals){
        //获取方法形参的名称列表
        //{"name", "age"}
        String[] parameterNames = localVariableTableParameterNameDiscoverer.getParameterNames(method);
        //循环形参名称
        for (int i = 0; i < parameterNames.length; i++) {
//           形参名称：parameterNames[i] -- 形参的值：vals[i]
            evaluationContext.setVariable(parameterNames[i], vals[i]);
        }

        //'mylock_' + #entity.name
        //获得：mylock_zhangsan
        //解析Spel表达式 返回一个表达式对象
        Expression expressionObj = expression.parseExpression(spel);
        //从表达式对象中获取结果
        String value = expressionObj.getValue(evaluationContext, String.class);
        return value;
    }
}
